/**
 * Description:     对bmp灰度位图进行图像平滑化操作，算法为均值滤波。
 * Function:        int meanFilter_3(GARYSCALEBIT garyscalebit, char *fileName);        3*3图像平滑化
 *                  int meanFilter_5(GARYSCALEBIT garyscalebit, char *fileName);        5*5图像平滑化
 * Solution:        如果你在使用本头文件时发现了任何问题，请报告issue.
 * Contributer:     叶月枫
 */

#ifndef imgS_h
#define imgS_h

// 声明函数
int meanFilter_3(GARYSCALEBIT garyscalebit, char *fileName);
int meanFilter_5(GARYSCALEBIT garyscalebit, char *fileName);

/**
 * Function:    对bmp灰度位图进行3*3图像平滑化
 * Parameter:   garyscalebit    [in]GARYSCALEBIT结构体，包括原图的灰度信息、数据个数和排列顺序
 *              fileName        [in]输入的文件名
 * Return:      0               操作成功
 */
int meanFilter_3(GARYSCALEBIT garyscalebit, char *fileName)
{
    int width = getInfoHeader(fileName).biWidth; // 获取图像宽度
    int height = getInfoHeader(fileName).biHeight; // 获取图像高度
    int sum; // 定义变量

    // 遍历图像像素
    for (int i = 1; i < height - 1; i++)
    {
        for (int j = 1; j < width - 1; j++)
        {
            sum = 0; // 初始化
            for (int y = -1; y <= 1; y++)
            {
                for (int x = -1; x <= 1; x++)
                {   
                    // 进行3*3的窗口计算
                    sum += garyscalebit.garyscale[(i * width + j) + (x + y * width)];
                }
            }
            garyscalebit.garyscale[i * width + j] = sum / 9;
        }
    }

    return 0;
}

/**
 * Function:    对bmp灰度位图进行5*5图像平滑化
 * Parameter:   garyscalebit    [in]GARYSCALEBIT结构体，包括原图的灰度信息、数据个数和排列顺序
 *              fileName        [in]输入的文件名
 * Return:      0               操作成功
 */
int meanFilter_5(GARYSCALEBIT garyscalebit, char *fileName)
{
    int width = getInfoHeader(fileName).biWidth; // 获取图像宽度
    int height = getInfoHeader(fileName).biHeight; // 获取图像高度
    int sum; // 定义变量

    // 遍历图像像素
    for (int i = 2; i < height - 2; i++)
    {
        for (int j = 2; j < width - 2; j++)
        {
            sum = 0; // 初始化
            for (int y = -2; y <= 2; y++)
            {
                for (int x = -2; x <= 2; x++)
                {   
                    // 进行5*5的窗口计算
                    sum += garyscalebit.garyscale[(i * width + j) + (x + y * width)];
                }
            }
            garyscalebit.garyscale[i * width + j] = sum / 25;
        }
    }
    
    return 0;
}

#endif